/**
 * Copyright 20124-现在 weavecode
 */
package com.wcs.exam.common.enums;

import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 支付类型(1：微信扫码、2：微信H5、3：微信APP、4：小程序支付、5：微信JSAPI、6：支付宝扫码、7：支付宝H5、8：支付宝APP)
 *
 * @author wcs
 */
@Getter
@AllArgsConstructor
public enum PayTypeEnum {

    /**
     * 微信扫码支付
     */
    WX_SCAN_PAY(1, PayWayEnum.WX_PAY, "wxScanPay", "微信扫码"),

    /**
     * 微信H5
     */
    WX_H5_PAY(2, PayWayEnum.WX_PAY, "wxWapPay", "微信H5"),

    /**
     * 微信APP
     */
    WX_APP_PAY(3, PayWayEnum.WX_PAY, "wxAppPay", "微信APP"),

    /**
     * 微信小程序支付
     */
    WX_MINI_APP_PAY(4, PayWayEnum.WX_PAY, "wxMiniAppPay", "微信小程序"),

    /**
     * 微信公众号支付
     */
    WX_MP_PAY(5, PayWayEnum.WX_PAY, "wxMpPay", "微信公众号"),

    /**
     * 支付宝扫码支付
     */
    ALI_SCAN_PAY(6, PayWayEnum.ALI_PAY, "aliScanPay", "支付宝扫码"),

    /**
     * 支付宝H5支付
     */
    ALI_H5_PAY(7, PayWayEnum.ALI_PAY, "aliWapPay", "支付宝H5"),

    /**
     * 支付宝APP支付
     */
    ALI_APP_PAY(8, PayWayEnum.ALI_PAY, "aliAppPay", "支付宝APP");

    /**
     * 编码
     */
    private final Integer code;

    /**
     * 支付方式
     */
    private final PayWayEnum payWay;

    /**
     * 支付实现 - 直连模式
     */
    private final String payImpl;

    /**
     * 描述
     */
    private final String desc;

    /**
     * 根据编码获取枚举信息
     *
     * @param code 编码
     * @return 枚举信息
     */
    public static PayTypeEnum byCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (PayTypeEnum val : PayTypeEnum.values()) {
            if (val.getCode().equals(code)) {
                return val;
            }
        }
        return null;
    }

    /**
     * 根据支付实现编码获取枚举信息
     *
     * @param payImpl 支付实现 - 直连模式
     * @return 枚举信息
     */
    public static PayTypeEnum byPayImpl(String payImpl) {
        if (StrUtil.isBlank(payImpl)) {
            return null;
        }

        for (PayTypeEnum val : PayTypeEnum.values()) {
            if (val.getPayImpl().equals(payImpl)) {
                return val;
            }
        }
        return null;
    }

}
